home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / TEMP / GNU / bison / Contextual < prev    next >
Text File  |  1995-06-28  |  2KB  |  60 lines

  1. Contextual Precedence
  2. Previous: <Precedence=>Precedencf> * Next: <Parser States=>ParserStat> * Up: <Algorithm=>Algorithm>
  3.  
  4. #Wrap on
  5. {fH3}Context-Dependent Precedence{f}
  6.  
  7. Often the precedence of an operator depends on the context.  This sounds
  8. outlandish at first, but it is really very common.  For example, a minus
  9. sign typically has a very high precedence as a unary operator, and a
  10. somewhat lower precedence (lower than multiplication) as a binary operator.
  11.  
  12. The Bison precedence declarations, {fCode}%left{f}, {fCode}%right{f} and
  13. {fCode}%nonassoc{f}, can only be used once for a given token; so a token has
  14. only one precedence declared in this way.  For context-dependent
  15. precedence, you need to use an additional mechanism: the {fCode}%prec{f}
  16. modifier for rules.
  17.  
  18. The {fCode}%prec{f} modifier declares the precedence of a particular rule by
  19. specifying a terminal symbol whose precedence should be used for that rule.
  20. It's not necessary for that symbol to appear otherwise in the rule.  The
  21. modifier's syntax is:
  22.  
  23. #Wrap off
  24. #fCode
  25. %prec {fStrong}terminal-symbol{f}
  26. #f
  27. #Wrap on
  28.  
  29. and it is written after the components of the rule.  Its effect is to
  30. assign the rule the precedence of {fStrong}terminal-symbol{f}, overriding
  31. the precedence that would be deduced for it in the ordinary way.  The
  32. altered rule precedence then affects how conflicts involving that rule
  33. are resolved (\*Note <Precedence=>Precedencf>: Operator Precedence).
  34.  
  35. Here is how {fCode}%prec{f} solves the problem of unary minus.  First, declare
  36. a precedence for a fictitious terminal symbol named {fCode}UMINUS{f}.  There
  37. are no tokens of this type, but the symbol serves to stand for its
  38. precedence:
  39.  
  40. #Wrap off
  41. #fCode
  42. %left '+' '-'
  43. %left '\*'
  44. %left UMINUS
  45. #f
  46. #Wrap on
  47.  
  48. Now the precedence of {fCode}UMINUS{f} can be used in specific rules:
  49.  
  50. #Wrap off
  51. #fCode
  52. exp:    …
  53.         | exp '-' exp
  54.         …
  55.         | '-' exp %prec UMINUS
  56. #f
  57. #Wrap on
  58.  
  59.